//
//  WBOAuthViewModel.swift
//  WB123
//
//  Created by xuyunde mac pro on 2017/7/2.
//  Copyright © 2017年 NSObjiect. All rights reserved.
//

import UIKit
// 帮助控制器OAuthVC请求数据
class WBOAuthViewModel: NSObject {

    // 全局访问点
    static let share: WBOAuthViewModel = WBOAuthViewModel()
    // 在沙盒中获取到保存用户数据的信息
    var userAccountModel: WBUserAccountModel?
    /// 抽取访问令牌(使用起来方便 因为token是有过期时间的 需要只要使用就需要判断是否过期)
    var accessToken: String?{
        
        //        // 判断userAccountModel是否为nil
        //        if userAccountModel == nil {
        //            return nil
        //        }else{
        //            // 我们保存了数据了
        //            // 需要判断是否过期  -> 不过期
        //            if userAccountModel?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending {
        //                return userAccountModel?.access_token
        //            }else{
        //                // 过期
        //                return nil
        //            }
        //        }
        // 抽取后
        if userAccountModel?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending {
            return userAccountModel?.access_token
        }else{
            // 过期
            return nil
        }
    }
    // 判断用户是否登录
    var isLogin: Bool{
        // 如果accessToken有值没过期--登录状态
        
        //如果为nil.代表过期了-未登录状态
//        if accessToken != nil{
//            return true
//        }else{
//            return false
//        }

        return accessToken != nil
    }
    
    // 路径- (数组)
    fileprivate let file = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! as NSString).appendingPathComponent("userAccount.archiver")
    // 重写init方法 完成userAccountModel 赋值
    override init() {
        super.init()
        // 因为单例的init方法只会走一次 所以只在沙盒取过一次数据
        userAccountModel = getUserAccountModel()
    }

}

// 帮助控制器请求数据
extension WBOAuthViewModel{
    //请求UserAccount
    func getUserAccount(code: String, finish:@escaping (Bool)->()){
        
        
        WBNetworkTools.share.oauthLoadUserAccount(code: code, success: { (response) in
            // 判断response是否为nil 且是否是一个字典
            // guard let 和 if let 判断可选值不为nil 而且是否是我们想要的类型 需要配合as?使用 因为可选值 可能数据不能转成功
            guard let res = response as? [String: Any] else{
                finish(false)
                return
            }
            // 通过字典转模型
            let userAccountModel = WBUserAccountModel(dict: res)
            print(userAccountModel)// 拿到token-*************************
            // 继续请求个人信息数据
            self.getUserInfo(userAccountModel: userAccountModel, finish: finish)
            
        }) { (error) in
            print("失败",error)
            finish(false)
        }
    }
    // 请求UserInfo
    private func getUserInfo(userAccountModel: WBUserAccountModel, finish:@escaping (Bool)->()){
        
        WBNetworkTools.share.oauthLoadUserInfo(userAccountModel: userAccountModel, success: { (response) in
            // 判断response是否为nil 而且是否可以转成一个字典
            guard let res = response as? [String: Any] else{
                finish(false)
                return
            }
            // 直接赋值
            userAccountModel.screen_name = res["screen_name"] as? String
            userAccountModel.avatar_large = res["avatar_large"] as? String
            print(userAccountModel)
            
            // 通过归档和解档保存数据
            self.saveUserAccountModel(userAccountModel: userAccountModel)
            finish(true)
            
        }) { (error) in
            print(error,"失败")
            finish(false)
        }
    }
}

extension WBOAuthViewModel{
    /*
     - 使用private修饰方法或者属性的时候 是只能在当前的作用域 不管是class 或者是extension 都是当前的作用域才可以使用private
     - 如果方法或者属性 需要在class 外 或者其它的extension中调用 但是还要保证这个方法或者属性外界不可以调用 需要使用fileprivate
     */
    // 保存数据
    fileprivate func saveUserAccountModel(userAccountModel: WBUserAccountModel){
        //路径(数组)--
        
        print(file)
        // 解决单例属性第一次没有值的bug 需要手动赋值
        self.userAccountModel = userAccountModel
        NSKeyedArchiver.archiveRootObject(userAccountModel, toFile: file)
    }
    //获取数据
    func getUserAccountModel()-> WBUserAccountModel?{
        //路径(数组)--
       
        let result =  NSKeyedUnarchiver.unarchiveObject(withFile: file) as? WBUserAccountModel
        return result
    }
}
